package unidades;

import clasesGenerales.PuedeConquistar;
import excepcionesUnidades.*;
import interfasesGenerales.Atacable;
import interfasesUnidades.*;
import excepcionesGenerales.*;
import mapas.*;
import civilizacion.*;

/**@author Grupo 2, Algoritmos y programacion 3, Catedra Fontela<br>1er cuat 2007
 * <br>Esta clase concreta se encarga de representar un civil. El mismo se puede montar,
 * y a diferencia del resto puede ser entrenado.
 */

public class Civil extends Habitante implements Montable, Entrenable,PuedeConquistar{

	/**
	 * Se encarga de inicializar el civil, con los valores correctos.
	 * @throws NullPointerException Excepcion que indica que la civilizacion o region
	 * asignados eran nulos.
	 */
	public Civil (Civilizacion cvl,Region region) throws  NullPointerException{
		super();
		try{
			
			setCoste(0);
			setTiempo(2);
			setVidaTotal(1);
			setAtaque(0);
			setDefensa(1);
			setDespTotal(1);
		}catch (ExcepAtributoInvalido e){}
		try{
			setDespRestante(1);
		} catch (ExcepSinMovimiento e){};
		setCivilizacion(cvl);
		setVidaRestante(1);
		setRegionAct(region);
	}
	public void atacar(Atacable objetivo) throws ExcepAtaqueInvalido{
				throw new ExcepAtaqueInvalido(); //Los civiles no atacan
	}
	
	/**
	 * Permite montarse en la unidad pasada como parametro
	 * @param unidad Unidad donde montarse.
	 * @throws ExcepCargaLlena Excepcion que indica que no hay mas lugar en el transporte
	 */
	public void montarA(Unidad unidad) throws ExcepCargaLlena{
		//Si la unidad es un albergador y puede albergar civiles
		if ((unidad instanceof Albergador) && (unidad instanceof AlbergadorCiviles)){
			Albergador transporte = (Albergador)unidad; //Casteo la unidad como albergador
			transporte.CargarUnidad(this); //Cargo el civil en el transporte
			getRegion().quitar(this); //Quito la unidad de la region
		}	
	}
	
	public String getNombre() {
		return "Civil";
	}

	
}
